"""
Streamlit界面
提供简单的Web界面供快速使用
"""
import streamlit as st
import requests
from typing import List, Dict
import sys
from pathlib import Path

# 添加项目根目录到Python路径
sys.path.insert(0, str(Path(__file__).parent))

st.set_page_config(
    page_title="医学文献智能检索与摘要平台",
    page_icon="🏥",
    layout="wide"
)

# 自定义CSS
st.markdown("""
    <style>
    .main-header {
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        color: white;
        padding: 2rem;
        border-radius: 10px;
        margin-bottom: 2rem;
        text-align: center;
    }
    .main-header h1 {
        margin-bottom: 0.5rem;
    }
    .paper-card {
        border: 2px solid #e0e0e0;
        border-radius: 10px;
        padding: 1.5rem;
        margin-bottom: 1rem;
        transition: all 0.3s;
    }
    .paper-card:hover {
        border-color: #667eea;
        box-shadow: 0 5px 20px rgba(102, 126, 234, 0.2);
    }
    .summary-box {
        background: #f8f9ff;
        padding: 1.5rem;
        border-radius: 10px;
        border-left: 5px solid #667eea;
        margin-bottom: 2rem;
    }
    </style>
""", unsafe_allow_html=True)

# API配置
API_BASE_URL = st.sidebar.text_input("API地址", value="http://localhost:8000")

def search_literature(query: str, top_k: int = 10) -> Dict:
    """
    调用后端API搜索文献
    
    Args:
        query: 搜索查询
        top_k: 返回结果数量
        
    Returns:
        搜索结果
    """
    try:
        response = requests.post(
            f"{API_BASE_URL}/search",
            json={"query": query, "top_k": top_k},
            timeout=60
        )
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        st.error(f"搜索失败: {str(e)}")
        return None

def display_paper(paper: Dict):
    """显示论文信息"""
    st.markdown(f"### {paper['title']}")
    
    col1, col2, col3 = st.columns(3)
    with col1:
        st.write("**作者：**", ", ".join(paper.get('authors', [])[:3]) or "未知")
    with col2:
        st.write("**期刊：**", paper.get('journal', '未知'))
    with col3:
        st.write("**相关性：**", f"{paper.get('relevance_score', 0) * 100:.1f}%")
    
    if paper.get('abstract'):
        st.markdown(f"**摘要：** {paper['abstract']}")
    
    if paper.get('full_text_url'):
        st.markdown(f"[🔗 查看完整论文]({paper['full_text_url']})")
    
    st.markdown("---")

def main():
    # 页面标题
    st.markdown("""
        <div class="main-header">
            <h1>🏥 医学文献智能检索与摘要平台</h1>
            <p>基于大模型的医学文献检索和自动摘要系统</p>
        </div>
    """, unsafe_allow_html=True)
    
    # 侧边栏
    st.sidebar.title("⚙️ 设置")
    st.sidebar.markdown("---")
    
    # 搜索框
    search_query = st.text_input(
        "🔍 搜索医学文献",
        placeholder="输入医学主题，例如：COVID-19 treatment, diabetes medication..."
    )
    
    col1, col2 = st.columns([3, 1])
    with col1:
        top_k = st.slider("返回结果数量", 1, 20, 10)
    with col2:
        search_clicked = st.button("🔍 搜索", type="primary")
    
    # 执行搜索
    if search_clicked and search_query:
        with st.spinner("正在搜索相关医学文献，请稍候..."):
            results = search_literature(search_query, top_k)
        
        if results:
            # 显示摘要
            if results.get('summary'):
                st.markdown("### 📋 智能摘要")
                st.markdown(f'<div class="summary-box">{results["summary"]}</div>', 
                          unsafe_allow_html=True)
            
            # 显示结果
            if results.get('papers'):
                st.markdown(f"### 📚 检索结果 (找到 {len(results['papers'])} 篇论文)")
                
                for paper in results['papers']:
                    display_paper(paper)
            else:
                st.warning("未找到相关论文，请尝试其他关键词")
    
    # 侧边栏帮助信息
    st.sidebar.markdown("---")
    st.sidebar.markdown("### 📖 使用说明")
    st.sidebar.markdown("""
        1. 在搜索框中输入医学主题
        2. 调整返回结果数量
        3. 点击搜索按钮
        4. 查看智能摘要和检索结果
        5. 点击链接查看完整论文
    """)
    
    st.sidebar.markdown("### 💡 搜索建议")
    st.sidebar.markdown("""
        - 使用具体的医学术语
        - 包含疾病、药物、治疗方法
        - 可以使用英文关键词
        - 例：COVID-19 treatment
    """)

if __name__ == "__main__":
    main()
